package com.aegis.common.web.xss;

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author wwx
 *
 * @Version 1.0
 * @Descritube XSS防御方式，在controller的实体中的属性使用该注解，可以进行XSS过滤
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside // 创建的自定义注解（如 @SanitizeWithJsoup）中包含了 Jackson 的注解，那么 Jackson 会把这些注解当作在字段上直接声明的一样处理
// 当反序列化这个字段时，使用 JsoupSanitizingDeserializer 来解析
// 默认情况下是直接new出来，但JsoupSanitizingDeserializer目前给spring托管了，所以不能直接new出来.(因为JsoupSanitizingDeserializer需要从单例池中拿到Safelist，所以交给了spring管理)
// 我们需要让jackson从spring容器中取JsoupSanitizingDeserializer，而不是直接new出来，所以需要注册Jackson2ObjectMapperBuilderCustomizer
@JsonDeserialize(using = JsoupSanitizingDeserializer.class)
public @interface SanitizeWithJsoup {
    // No parameters needed for this simple version
}